use crate::sketchbook::ids::DatasetId;
use crate::sketchbook::observations::Observation;
use crate::sketchbook::JsonSerde;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ObservationData {
    pub id: String,
    pub name: String,
    pub annotation: String,
    pub dataset: String,
    pub values: String,
}
impl<'de> JsonSerde<'de> for ObservationData {}
impl ObservationData {
    pub fn new(
        obs_id: &str,
        name: &str,
        annot: &str,
        dataset_id: &str,
        values: &str,
    ) -> ObservationData {
        ObservationData {
            id: obs_id.to_string(),
            name: name.to_string(),
            annotation: annot.to_string(),
            dataset: dataset_id.to_string(),
            values: values.to_string(),
        }
    }
    pub fn from_obs(obs: &Observation, dataset_id: &DatasetId) -> ObservationData {
        ObservationData::new(
            obs.get_id().as_str(),
            obs.get_name(),
            obs.get_annotation(),
            dataset_id.as_str(),
            &obs.to_values_string(),
        )
    }
    pub fn to_observation(&self) -> Result<Observation, String> {
        Observation::try_from_str_annotated(
            &self.values.clone(),
            &self.id,
            &self.name,
            &self.annotation,
        )
    }
}
#[cfg(test)]
mod tests {
    use crate::sketchbook::data_structs::ObservationData;
    use crate::sketchbook::ids::DatasetId;
    use crate::sketchbook::observations::Observation;
    #[test]
    fn test_converting() {
        let dataset_id = DatasetId::new("d").unwrap();
        let obs_before = Observation::try_from_str("0011*", "o").unwrap();
        let obs_data = ObservationData::from_obs(&obs_before, &dataset_id);
        let obs_after = obs_data.to_observation().unwrap();
        assert_eq!(obs_before, obs_after);
    }
}